<?php
/*
 * program:	均源
 * author:	雨中漫步 & 上善若水 & qhxin
 * email:	qhxin@qhxin.com
 * date:	2014/11/11
 * description:	又是一年双十一，不能剁手，就写点东西吧~~~~~~
 */

defined('IN_SCHOOL') or die();

/*{TranslateTagBegin}*/
class misc {
	/*
	人性化时间
	*/
	public static function humandate($timestamp) {
		$seconds = $_SERVER['time'] - $timestamp;
		if($seconds > 31536000) {
			return date('Y-n-j', $timestamp);
		} elseif($seconds > 2592000) {
			return ceil($seconds / 2592000).'月前';
		} elseif($seconds > 86400) {
			return ceil($seconds / 86400).'天前';
		} elseif($seconds > 3600) {
			return ceil($seconds / 3600).'小时前';
		} elseif($seconds > 60) {
			return ceil($seconds / 60).'分钟前';
		} else {
			return $seconds.'秒前';
		}
	}
	
	/*
	人性化数字
	*/
	public static function humannumber($num) {
		if($num > 10000) {
			return ceil($num / 10000).'万';
		} elseif($num>1000) {
			return ceil($num / 1000).'千';
		} elseif($num>100) {
			return ceil($num / 100).'百';
		} elseif($num>10) {
			return ceil($num/10).'十';
		} else {
			return $num;
		}
	}
	
	/*
	人性化大小
	*/
	public static function humansize($num) {
		if($num > 1073741824) {
			return number_format($num / 1073741824, 2, '.', '').'GB';
		} elseif($num > 1048576) {
			return number_format($num / 1048576, 2, '.', '').'MB';
		} elseif($num > 1024) {
			return number_format($num / 1024, 2, '.', '').'KB';
		} else {
			return $num.'B';
		}
	}
	
	/*
	gbk to utf8
	*/
	public static function gbktoutf8($str){
		return mb_convert_encoding($str, 'utf-8', 'gbk');
	}
	
	/*
	从一个二维数组中取出一个 key=>value 格式的一维数组
	*/
	public static function arr_key_values($arrlist, $key, $value) {
		$return = array();
		if($key) {
			foreach((array)$arrlist as $arr) {
				$return[$arr[$key]] = $arr[$value];
			}
		} else {
			foreach((array)$arrlist as $arr) {
				$return[] = $arr[$value];
			}
		}
		return $return;
	}
	
	/*
	utf8字符串截取
	*/
	public static function utf8_sub_str($str, $from, $len){
		return preg_replace('#^(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,'.$from.'}'. 
			'((?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,'.$len.'}).*#s',
			'$1',$str);
	}

	/*
	字符串查找字符结果
	*/
	public static function in_key_str($needle, $haystack) {
		return strpos("{$needle}", "{$haystack}") !== FALSE;
	}
	
	/*
	字符串中查找数组元素
	*/
	public static function in_arr_str($needle, &$array) {
		foreach($array as $k=>$v) {
			if(self::in_key_str($needle, $v)) return TRUE;
		}
		return FALSE;
	}
	
	/*
	安全过滤，过滤掉所有特殊字符，仅保留英文下划线，中文。其他语言需要修改U的范围
	*/
	public static function safe_str($s, $ext = '') {
		$ext = preg_quote($ext);
		$s = preg_replace('#[^'.$ext.'\w\x{4e00}-\x{9fa5}]+#u', '', $s);
		return $s;
	}
	
	/*
	判断是否是搜索引擎访问
	*/
	public static function is_robot() {
		$robots = array('robot', 'spider', 'slurp');
		foreach($robots as $robot) {
			if(strpos(core::gpc('HTTP_USER_AGENT', 'S'), $robot) !== FALSE) {
				return TRUE;
			}
		}
		return FALSE;
	}
	
	/*
	判断文件系统是否可写
	*/
	public static function is_writable($file) {
		// 主要是兼容 windows
		try {
			if(is_file($file)) {
				if(strpos(strtoupper(PHP_OS), 'WIN') !== FALSE) {
					$fp = @fopen($file, 'rb+');
					@fclose($fp);
					return (bool)$fp;
				} else {
					return is_writable($file);
				}
			} elseif(is_dir($file)) {
				$tmpfile = $file.'/____tmp.tmp';
				$n = @file_put_contents($tmpfile, 'a');
				if($n > 0) {
					unlink($tmpfile);
					return TRUE;
				} else {
					return FALSE;
				}
			}
		} catch(Exception $e) {
			return false;
		}
	}
	
	// 替代 scandir, safe_mode
	public static function scandir($dir) {
		if(function_exists('scan_dir')) return scandir($dir);
		$df = opendir($dir);
		$arr = array();
		while($file = readdir($df)) {
			if($file == '.' || $file == '..') continue;
			$arr[] = $file;
		}
		closedir($df);
		return $arr;
	}
	
	/*
	递归复制目录，src原目录，dst复制到的目录
	*/
	public static function recurse_copy($src,$dst) {
		$dir = opendir($src);
		@mkdir($dst);
		while(false !== ( $file = readdir($dir)) ) {
			if (( $file != '.' ) && ( $file != '..' )) {
				if ( is_dir($src . '/' . $file) ) {
					self::recurse_copy($src . '/' . $file,$dst . '/' . $file);
				} else {
					copy($src . '/' . $file, $dst . '/' . $file);
				}
			}
		}
		closedir($dir);
	}
	
	/*
	递归删除目录，这个函数比较危险，传参一定要小心
	*/
	public static function rmdir($dir,$keepfiles = array(), $keepdir = 0) {
		if($dir == '/' || $dir == '../') return FALSE;// 不允许删除根目录，避免程序意外删除数据。
		if(!is_dir($dir)) return FALSE;
		substr($dir, -1, 1) != '/' && $dir .= '/';
		$files = self::scandir($dir);
		foreach($files as $file) {
			if($file == '.' || $file == '..' || in_array($file,$keepfiles)) continue;
			$filepath = $dir.$file;
			if(!is_dir($filepath)) {
				try {unlink($filepath);} catch (Exception $e) {}
			} else {
				self::rmdir($filepath.'/');
			}
		}
		try {if(!$keepdir) rmdir($dir);} catch (Exception $e) {}
		return TRUE;
	}
	
	
}
/*{TranslateTagEnd}*/

?>